<?php
/**
 * i18n类库.
 * 
 * 
 * 提供国际化支持.此文件由wordpress提供,Leo Ning 改写以适应本框架.
 * 
 * @author Leo Ning <leo.ning@like18.com>
 * @copyright LIKE18 INC. 2008 - 2011
 * @version 1.0
 * @since 1.0
 * @package i18n
 */
/**
 * Class for working with MO files
 */
include NUTZP_PATH. 'core/i18n/mo.php';
/**
 * Gets the current locale.
 *
 * If the locale is set, then it will filter the locale in the 'locale' filter
 * hook and return the value.
 *
 * If the locale is not set already, then the WPLANG constant is used if it is
 * defined. Then it is filtered through the 'locale' filter hook and the value
 * for the locale global set and the locale is returned.
 *
 * The process to get the locale should only be done once but the locale will
 * always be filtered using the 'locale' hook.
 *
 * @uses apply_filter() Calls 'locale' hook on locale value.
 * @uses $locale Gets the locale stored in the global.
 *
 * @return string The locale of the blog or from the 'locale' hook.
 */
function get_locale() {
	global $locale;
	if (isset ( $locale )) {
		return apply_filter ( 'locale', $locale );
	}
	if (defined ( 'LANGUAGE' )) {
		$locale = LANGUAGE;
	}
	if (empty ( $locale )) {
		$locale = 'zh_CN';
	}
	return apply_filter ( 'locale', $locale );
}

/**
 * Retrieves the translation of $text. If there is no translation, or
 * the domain isn't loaded the original text is returned.
 *
 * @see __() Don't use translate() directly, use __() 
 * @uses apply_filter() Calls 'gettext' on domain translated text
 * with the untranslated text as second parameter.
 *
 * @param string $text Text to translate.
 * @param string $domain Domain to retrieve the translated text.
 * @return string Translated text
 */
function translate($text, $domain = 'default') {
	$translations = get_translations_for_domain ( $domain );
	return apply_filter ( 'gettext', $translations->translate ( $text ), $text, $domain );
}
/**
 * 
 * @access private
 */
function before_last_bar($string) {
	$last_bar = strrpos ( $string, '|' );
	if (false == $last_bar)
		return $string;
	else
		return substr ( $string, 0, $last_bar );
}
/**
 * 
 * @access private
 */
function translate_with_gettext_context($text, $context, $domain = 'default') {
	$translations = get_translations_for_domain ( $domain );
	return apply_filter ( 'gettext_with_context', $translations->translate ( $text, $context ), $text, $context, $domain );
}

/**
 * Retrieves the translation of $text. If there is no translation, or
 * the domain isn't loaded the original text is returned.
 *
 * @see translate() An alias of translate()
 *
 * @param string $text Text to translate
 * @param string $domain Optional. Domain to retrieve the translated text
 * @return string Translated text
 */
function __($text, $domain = 'default') {
	return translate ( $text, $domain );
}

/**
 * Retrieves the translation of $text and escapes it for safe use in an attribute.
 * If there is no translation, or the domain isn't loaded the original text is returned.
 *
 * @see translate() An alias of translate()
 * @see esc_attr()
 *
 * @param string $text Text to translate
 * @param string $domain Optional. Domain to retrieve the translated text
 * @return string Translated text
 */
function esc_attr__($text, $domain = 'default') {
	return esc_attr ( translate ( $text, $domain ) );
}

/**
 * Retrieves the translation of $text and escapes it for safe use in HTML output.
 * If there is no translation, or the domain isn't loaded the original text is returned.
 *
 * @see translate() An alias of translate()
 * @see esc_html()
 *
 * @param string $text Text to translate
 * @param string $domain Optional. Domain to retrieve the translated text
 * @return string Translated text
 */
function esc_html__($text, $domain = 'default') {
	return esc_html ( translate ( $text, $domain ) );
}

/**
 * Displays the returned translated text from translate().
 *
 * @see translate() Echoes returned translate() string
 *
 * @param string $text Text to translate
 * @param string $domain Optional. Domain to retrieve the translated text
 */
function _e($text, $domain = 'default') {
	echo translate ( $text, $domain );
}

/**
 * Displays translated text that has been escaped for safe use in an attribute.
 *
 * @see translate() Echoes returned translate() string
 * @see esc_attr()
 *
 * @param string $text Text to translate
 * @param string $domain Optional. Domain to retrieve the translated text
 */
function esc_attr_e($text, $domain = 'default') {
	echo esc_attr ( translate ( $text, $domain ) );
}

/**
 * Displays translated text that has been escaped for safe use in HTML output.
 *
 * @see translate() Echoes returned translate() string
 * @see esc_html()
 *
 * @param string $text Text to translate
 * @param string $domain Optional. Domain to retrieve the translated text
 */
function esc_html_e($text, $domain = 'default') {
	echo esc_html ( translate ( $text, $domain ) );
}

/**
 * Retrieve translated string with gettext context
 *
 * Quite a few times, there will be collisions with similar translatable text
 * found in more than two places but with different translated context.
 *
 * By including the context in the pot file translators can translate the two
 * string differently.
 *
 *
 * @param string $text Text to translate
 * @param string $context Context information for the translators
 * @param string $domain Optional. Domain to retrieve the translated text
 * @return string Translated context string without pipe
 */
function _x($single, $context, $domain = 'default') {
	return translate_with_gettext_context ( $single, $context, $domain );
}

/**
 * Displays translated string with gettext context
 *
 * @see _x
 *
 * @param string $text Text to translate
 * @param string $context Context information for the translators
 * @param string $domain Optional. Domain to retrieve the translated text
 * @return string Translated context string without pipe
 */
function _ex($single, $context, $domain = 'default') {
	echo _x ( $single, $context, $domain );
}

function esc_attr_x($single, $context, $domain = 'default') {
	return esc_attr ( translate_with_gettext_context ( $single, $context, $domain ) );
}

function esc_html_x($single, $context, $domain = 'default') {
	return esc_html ( translate_with_gettext_context ( $single, $context, $domain ) );
}

/**
 * Retrieve the plural or single form based on the amount.
 *
 * If the domain is not set in the $l10n list, then a comparison will be made
 * and either $plural or $single parameters returned.
 *
 * If the domain does exist, then the parameters $single, $plural, and $number
 * will first be passed to the domain's ngettext method. Then it will be passed
 * to the 'ngettext' filter hook along with the same parameters. The expected
 * type will be a string.
 *
 * @uses $l10n Gets list of domain translated string (gettext_reader) objects
 * @uses apply_filter() Calls 'ngettext' hook on domains text returned,
 * along with $single, $plural, and $number parameters. Expected to return string.
 *
 * @param string $single The text that will be used if $number is 1
 * @param string $plural The text that will be used if $number is not 1
 * @param int $number The number to compare against to use either $single or $plural
 * @param string $domain Optional. The domain identifier the text should be retrieved in
 * @return string Either $single or $plural translated text
 */
function _n($single, $plural, $number, $domain = 'default') {
	$translations = get_translations_for_domain ( $domain );
	$translation = $translations->translate_plural ( $single, $plural, $number );
	return apply_filter ( 'ngettext', $translation, $single, $plural, $number, $domain );
}

/**
 * A hybrid of _n() and _x(). It supports contexts and plurals.
 *
 * @see _n()
 * @see _x()
 *
 */
function _nx($single, $plural, $number, $context, $domain = 'default') {
	$translations = get_translations_for_domain ( $domain );
	$translation = $translations->translate_plural ( $single, $plural, $number, $context );
	return apply_filter ( 'ngettext_with_context', $translation, $single, $plural, $number, $context, $domain );
}

/**
 * Register plural strings in POT file, but don't translate them.
 *
 * Used when you want do keep structures with translatable plural strings and
 * use them later.
 *
 * Example:
 * $messages = array(
 * 'post' => _n_noop('%s post', '%s posts'),
 * 'page' => _n_noop('%s pages', '%s pages')
 * );
 * ...
 * $message = $messages[$type];
 * $usable_text = sprintf(_n($message[0], $message[1], $count), $count);
 *
 * @param $single Single form to be i18ned
 * @param $plural Plural form to be i18ned
 * @return array array($single, $plural)
 */
function _n_noop($single, $plural) {
	return array ($single, $plural );
}

/**
 * Register plural strings with context in POT file, but don't translate them.
 *
 * @see _n_noop()
 */
function _nx_noop($single, $plural, $context) {
	return array ($single, $plural, $context );
}

/**
 * Loads a MO file into the domain $domain.
 *
 * If the domain already exists, the translations will be merged. If both
 * sets have the same string, the translation from the original value will be taken.
 *
 * On success, the .mo file will be placed in the $l10n global by $domain
 * and will be a MO object.
 *
 * @since 1.5.0
 * @uses $l10n Gets list of domain translated string objects
 *
 * @param string $domain Unique identifier for retrieving translated strings
 * @param string $mofile Path to the .mo file
 * @return bool true on success, false on failure
 */
function load_textdomain($domain, $mofile) {
	global $l10n;
	
	$plugin_override = apply_filter ( 'override_load_textdomain', false, $domain, $mofile );
	
	if (true == $plugin_override) {
		return true;
	}
	
	fire ( 'load_textdomain', $domain, $mofile );
	
	$mofile = apply_filter ( 'load_textdomain_mofile', $mofile, $domain );
	
	if (! is_readable ( $mofile ))
		return false;
	
	$mo = new MO ();
	if (! $mo->import_from_file ( $mofile ))
		return false;
	
	if (isset ( $l10n [$domain] ))
		$mo->merge_with ( $l10n [$domain] );
	
	$l10n [$domain] = &$mo;
	
	return true;
}

/**
 * Unloads translations for a domain
 *
 * @param string $domain Textdomain to be unloaded
 * @return bool Whether textdomain was unloaded
 */
function unload_textdomain($domain) {
	global $l10n;
	
	$plugin_override = apply_filter ( 'override_unload_textdomain', false, $domain );
	
	if ($plugin_override)
		return true;
	
	fire ( 'unload_textdomain', $domain );
	
	if (isset ( $l10n [$domain] )) {
		unset ( $l10n [$domain] );
		return true;
	}
	
	return false;
}

/**
 * Loads default translated strings based on locale.
 *
 * Loads the .mo file in ETC locale constant path from Application root. The
 * translated (.mo) file is named based off of the locale.
 * 
 */
function load_default_textdomain() {
	$locale = get_locale ();
	load_textdomain ( 'default', COMMONS . "locale" . DS . "$locale.mo" );
}
/**
 * Loads plugin $plugin translated strings based on locale.
 *
 * Loads the .mo file in ETC locale constant path from Application root. The
 * translated (.mo) file is named based off of the locale.
 * @param string $plugin
 */
function load_module_textdomain($module, $domain = 'default') {
	$locale = get_locale ();
	load_textdomain ( $domain, MODULES . $module . DS . "locale" . DS . "$locale.mo" );
}
/**
 * Returns the Translations instance for a domain. If there isn't one,
 * returns empty Translations instance.
 *
 * @param string $domain
 * @return object A Translation instance
 */
function get_translations_for_domain($domain) {
	global $l10n;
	if (! isset ( $l10n [$domain] )) {
		$l10n [$domain] = new NOOP_Translations ();
	}
	return $l10n [$domain];
}

/**
 * Whether there are translations for the domain
 *
 * @param string $domain
 * @return bool Whether there are translations
 */
function is_textdomain_loaded($domain) {
	global $l10n;
	return isset ( $l10n [$domain] );
}